11.- Altaveus i melodies
1-Esquema elèctric.
Per reproduir notes músicals amb arduino ens cal tindre un altaveu en sèrie amb una resistència de 100 Ohms.
2.- Emisió de sons.
Si volem generar sons ho farem amb l'ordre tone(pin, freqüència, duració) , on la freqüència és nombre de vegades que es repeteix la ona quadrada i que varia entre 20Hz i 20000 Hz si volem que la puguen escoltar el humans, la duració és el nombre de miilisegons que s'emetrà el só.
Podem fer un programa molt senzill que emeta sons com aquest on cal saber la freqüència de cada nota.
//Copyleft(2012)= C. Ferrando // const int altaveu = 8; // connecta l'altaveu al pin 8 void setup() { } void loop() { tone(altaveu,261, 333); // interpreta la nota Do usant la seua freqüència delay(333); //fem un silenci de 333 ms tone(altaveu,294, 333); // interpreta la nota Re usant la seua freqüència delay(333); //fem un silenci de 333 ms tone(altaveu,329, 333); // interpreta la nota Mi usant la seua freqüència delay(333); //fem un silenci de 333 ms tone(altaveu,349, 333); // interpreta la nota Fa usant la seua freqüència delay(333); //fem un silenci de 333 ms tone(altaveu,392, 333); // interpreta la nota Sol usant la seua freqüència delay(333); //fem un silenci de 333 ms tone(altaveu,440, 333); // interpreta la nota La usant la seua freqüència delay(333); //fem un silenci de 333 ms tone(altaveu,493, 333); // interpreta la nota Si usant la seua freqüència delay(4000); //fem un silenci de 4000 ms } |
O podem definir col·leccions de dades i amb cicles for cerquem les notes dins les col·lecions definides, així no cal saber les freqüències de memòria.
//Copyleft(2011)= Michael Margolis //Modificat: C.Ferrando // const int altaveu = 8; // connecta l'altaveu al pin 8 char nomNotes[] ={'Do','Re','Mi','Fa','Sol','La','Si'}; unsigned int frequencies[] = {261,294,329,349,392,440,493}; const byte comptaNotes = sizeof(nomNotes); // el nom de les notes (7 en aquest exemple)// un espai entre notes representa un silenci char partitura[] = "Do,Re,Mi,Fa,Sol,La,Si, ,Do,Re,Mi,Fa,Sol,La,Si, ,Do,Re,Mi,Fa,Sol,La,Si"; const byte longitudPartitura = sizeof(partitura); // el nombre de notes en la partitura void setup() { } void loop() { for (int i = 0; i < longitudPartitura; i++) { int duracio = 333; // cada nota dura la tercera part d'un segon interpretaNota(partitura[i], duracio); // interpreta la nota } delay(8000); // espera huit segons abans de repetir la melodia } void interpretaNota(char nota, int duracio) { // interpreta el to que correspon a la nota for (int i = 0; i < comptaNotes; i++) { // cerca la nota al catàleg de notes if (nomNotes[i] == nota) // troba la nota a la colecció de nomNotes tone(altaveu, frequencies[i], duracio); // interpreta la nota usant la seua freqüència } // Temps d'espera entre dues notes (no pot ser cero) delay(100); } |
Qüestió: Estalvi d'espai de memòria
Les variables "comptaNotes" i "longitudPartitura" que emmagatzemen la quantitat de notes a les coleccions de dades char nomNotes[ ] i char partitura[ ] s'han definit utilitzant el tipus byte en lloc del tipus int .
Quanta memòria ens em estalviat ?
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial CompartirIgual 3.0